<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="基本信息  介绍：较安全实现远程连接，控制，传输的一种工具。  基础知识 SSH之所以能够保证安全，原因在于它采用了公钥加密。整个过程是这样的：
 远程主机收到用户的登录请求，把自己的公钥发给用户。 用户使用这个公钥，将登录密码加密后，发送回来。 远程主机用自己的私钥，解密登录密码，如果密码正确，就同意用户登录。  这个过程本身是安全的，但是实施的时候存在一个风险：如果有人截获了登录请求，然后冒充远程主机，将伪造的公钥发给用户，那么用户很难辨别真伪。因为不像https协议，SSH协议的公钥是没有证书中心1（CA）公证的，也就是说，都是自己签发的。
 ssh 默认端口是 22  客户端 安装 apt install openssh-client 登录 以用户名 user ，登录远程主机 host
ssh user@host 使用 p 参数指定端口
ssh -p 2222 user@host 第一次登陆 ssh 会指出host主机的公钥指纹，可由此判断此主机是否是真实目标（防止中间人攻击）。确认后会要求输入密码。当远程主机的公钥被接受以后，它就会被保存在文件 $HOME/.ssh/known_hosts之中。下次再连接这台主机，系统就会认出它的公钥已经保存在本地了，从而跳过警告部分，直接提示输入密码。
公钥登录 所谓&amp;quot;公钥登录&amp;quot;，原理很简单，就是用户将自己的公钥储存在远程主机上。登录的时候，远程主机会向用户发送一段随机字符串，用户用自己的私钥加密后，再发回来。远程主机用事先储存的公钥进行解密，如果成功，就证明用户是可信的，直接允许登录shell，不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的，可以直接用 ssh-keygen 生成一个。 然后使用 ssh-copy-id user@host 命令，将公钥传送到远程主机host上（也可直接修改远程主机公钥存储文件）。 远程主机将用户的公钥，保存在登录后的用户主目录的 $HOME/.ssh/authorized_keys 文件中。公钥就是一段字符串，只要把它追加在 authorized_keys 文件的末尾就行了。 如果远程主机禁用了公钥登录，修改远程主机上的 /etc/ssh/sshd_config 后重启服务：
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 单句执行 ssh user@host &amp;#39;mkdir -p .ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ."><title>SSH - Secure Shell</title><link rel=canonical href=https://stardustdl.gitee.io/posts/tools/ssh/><link rel=stylesheet href=/scss/style.min.css><meta property="og:title" content="SSH - Secure Shell"><meta property="og:description" content="基本信息  介绍：较安全实现远程连接，控制，传输的一种工具。  基础知识 SSH之所以能够保证安全，原因在于它采用了公钥加密。整个过程是这样的：
 远程主机收到用户的登录请求，把自己的公钥发给用户。 用户使用这个公钥，将登录密码加密后，发送回来。 远程主机用自己的私钥，解密登录密码，如果密码正确，就同意用户登录。  这个过程本身是安全的，但是实施的时候存在一个风险：如果有人截获了登录请求，然后冒充远程主机，将伪造的公钥发给用户，那么用户很难辨别真伪。因为不像https协议，SSH协议的公钥是没有证书中心1（CA）公证的，也就是说，都是自己签发的。
 ssh 默认端口是 22  客户端 安装 apt install openssh-client 登录 以用户名 user ，登录远程主机 host
ssh user@host 使用 p 参数指定端口
ssh -p 2222 user@host 第一次登陆 ssh 会指出host主机的公钥指纹，可由此判断此主机是否是真实目标（防止中间人攻击）。确认后会要求输入密码。当远程主机的公钥被接受以后，它就会被保存在文件 $HOME/.ssh/known_hosts之中。下次再连接这台主机，系统就会认出它的公钥已经保存在本地了，从而跳过警告部分，直接提示输入密码。
公钥登录 所谓&amp;quot;公钥登录&amp;quot;，原理很简单，就是用户将自己的公钥储存在远程主机上。登录的时候，远程主机会向用户发送一段随机字符串，用户用自己的私钥加密后，再发回来。远程主机用事先储存的公钥进行解密，如果成功，就证明用户是可信的，直接允许登录shell，不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的，可以直接用 ssh-keygen 生成一个。 然后使用 ssh-copy-id user@host 命令，将公钥传送到远程主机host上（也可直接修改远程主机公钥存储文件）。 远程主机将用户的公钥，保存在登录后的用户主目录的 $HOME/.ssh/authorized_keys 文件中。公钥就是一段字符串，只要把它追加在 authorized_keys 文件的末尾就行了。 如果远程主机禁用了公钥登录，修改远程主机上的 /etc/ssh/sshd_config 后重启服务：
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 单句执行 ssh user@host &amp;#39;mkdir -p .ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ."><meta property="og:url" content="https://stardustdl.gitee.io/posts/tools/ssh/"><meta property="og:site_name" content="StardustDL's Blog"><meta property="og:type" content="article"><meta property="article:section" content="Posts"><meta property="article:published_time" content="2018-09-17T18:40:02+08:00"><meta property="article:modified_time" content="2018-09-17T18:40:02+08:00"><meta name=twitter:title content="SSH - Secure Shell"><meta name=twitter:description content="基本信息  介绍：较安全实现远程连接，控制，传输的一种工具。  基础知识 SSH之所以能够保证安全，原因在于它采用了公钥加密。整个过程是这样的：
 远程主机收到用户的登录请求，把自己的公钥发给用户。 用户使用这个公钥，将登录密码加密后，发送回来。 远程主机用自己的私钥，解密登录密码，如果密码正确，就同意用户登录。  这个过程本身是安全的，但是实施的时候存在一个风险：如果有人截获了登录请求，然后冒充远程主机，将伪造的公钥发给用户，那么用户很难辨别真伪。因为不像https协议，SSH协议的公钥是没有证书中心1（CA）公证的，也就是说，都是自己签发的。
 ssh 默认端口是 22  客户端 安装 apt install openssh-client 登录 以用户名 user ，登录远程主机 host
ssh user@host 使用 p 参数指定端口
ssh -p 2222 user@host 第一次登陆 ssh 会指出host主机的公钥指纹，可由此判断此主机是否是真实目标（防止中间人攻击）。确认后会要求输入密码。当远程主机的公钥被接受以后，它就会被保存在文件 $HOME/.ssh/known_hosts之中。下次再连接这台主机，系统就会认出它的公钥已经保存在本地了，从而跳过警告部分，直接提示输入密码。
公钥登录 所谓&amp;quot;公钥登录&amp;quot;，原理很简单，就是用户将自己的公钥储存在远程主机上。登录的时候，远程主机会向用户发送一段随机字符串，用户用自己的私钥加密后，再发回来。远程主机用事先储存的公钥进行解密，如果成功，就证明用户是可信的，直接允许登录shell，不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的，可以直接用 ssh-keygen 生成一个。 然后使用 ssh-copy-id user@host 命令，将公钥传送到远程主机host上（也可直接修改远程主机公钥存储文件）。 远程主机将用户的公钥，保存在登录后的用户主目录的 $HOME/.ssh/authorized_keys 文件中。公钥就是一段字符串，只要把它追加在 authorized_keys 文件的末尾就行了。 如果远程主机禁用了公钥登录，修改远程主机上的 /etc/ssh/sshd_config 后重启服务：
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 单句执行 ssh user@host &amp;#39;mkdir -p .ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ."><link rel="shortcut icon" href=/favicon.png><script type=application/javascript>var doNotTrack=!1;doNotTrack||(function(a,e,f,g,b,c,d){a.GoogleAnalyticsObject=b,a[b]=a[b]||function(){(a[b].q=a[b].q||[]).push(arguments)},a[b].l=1*new Date,c=e.createElement(f),d=e.getElementsByTagName(f)[0],c.async=1,c.src=g,d.parentNode.insertBefore(c,d)}(window,document,'script','https://www.google-analytics.com/analytics.js','ga'),ga('create','UA-111573521-1','auto'),ga('send','pageview'))</script></head><body class="article-page has-toc"><script>(function(){const a='StackColorScheme';localStorage.getItem(a)||localStorage.setItem(a,"auto")})()</script><script>(function(){const b='StackColorScheme',a=localStorage.getItem(b),c=window.matchMedia('(prefers-color-scheme: dark)').matches===!0;a=='dark'||a==='auto'&&c?document.documentElement.dataset.scheme='dark':document.documentElement.dataset.scheme='light'})()</script><div class="container main-container flex
extended"><div id=article-toolbar><a href=/ class=back-home><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><polyline points="15 6 9 12 15 18"/></svg><span>Back</span></a></div><main class="main full-width"><article class=main-article><header class=article-header><div class=article-details><header class=article-category><a href=/categories/tools/>Tools</a></header><h2 class=article-title><a href=/posts/tools/ssh/>SSH - Secure Shell</a></h2><footer class=article-time><div><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-calendar-time" width="56" height="56" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><path d="M11.795 21H5a2 2 0 01-2-2V7a2 2 0 012-2h12a2 2 0 012 2v4"/><circle cx="18" cy="18" r="4"/><path d="M15 3v4"/><path d="M7 3v4"/><path d="M3 11h16"/><path d="M18 16.496V18l1 1"/></svg><time class=article-time--published>Sep 17, 2018</time></div><div><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clock" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 15 15"/></svg><time class=article-time--reading>1 minute read</time></div></footer></div></header><section class=article-content><h1 id=基本信息>基本信息</h1><ul><li>介绍：较安全实现远程连接，控制，传输的一种工具。</li></ul><h1 id=基础知识>基础知识</h1><p>SSH之所以能够保证安全，原因在于它采用了公钥加密。整个过程是这样的：</p><ol><li>远程主机收到用户的登录请求，把自己的公钥发给用户。</li><li>用户使用这个公钥，将登录密码加密后，发送回来。</li><li>远程主机用自己的私钥，解密登录密码，如果密码正确，就同意用户登录。</li></ol><p>这个过程本身是安全的，但是实施的时候存在一个风险：如果有人截获了登录请求，然后冒充远程主机，将伪造的公钥发给用户，那么用户很难辨别真伪。因为不像https协议，SSH协议的公钥是没有证书中心1（CA）公证的，也就是说，都是自己签发的。</p><ul><li>ssh 默认端口是 22</li></ul><h1 id=客户端>客户端</h1><h2 id=安装>安装</h2><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>apt install openssh-client
</code></pre></div><h2 id=登录>登录</h2><p>以用户名 user ，登录远程主机 host</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>ssh user@host
</code></pre></div><p>使用 <code>p</code> 参数指定端口</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>ssh -p <span class=m>2222</span> user@host
</code></pre></div><p>第一次登陆 ssh 会指出host主机的公钥指纹，可由此判断此主机是否是真实目标（防止中间人攻击）。确认后会要求输入密码。当远程主机的公钥被接受以后，它就会被保存在文件 <code>$HOME/.ssh/known_hosts</code>之中。下次再连接这台主机，系统就会认出它的公钥已经保存在本地了，从而跳过警告部分，直接提示输入密码。</p><h3 id=公钥登录>公钥登录</h3><p>所谓"公钥登录"，原理很简单，就是用户将自己的公钥储存在远程主机上。登录的时候，远程主机会向用户发送一段随机字符串，用户用自己的私钥加密后，再发回来。远程主机用事先储存的公钥进行解密，如果成功，就证明用户是可信的，直接允许登录shell，不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的，可以直接用 <code>ssh-keygen</code> 生成一个。
然后使用 <code>ssh-copy-id user@host</code> 命令，将公钥传送到远程主机host上（也可直接修改远程主机公钥存储文件）。
远程主机将用户的公钥，保存在登录后的用户主目录的 <code>$HOME/.ssh/authorized_keys</code> 文件中。公钥就是一段字符串，只要把它追加在 <code>authorized_keys</code> 文件的末尾就行了。
如果远程主机禁用了公钥登录，修改远程主机上的 <code>/etc/ssh/sshd_config</code> 后重启服务：</p><pre><code>RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
</code></pre><h2 id=单句执行>单句执行</h2><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>ssh user@host <span class=s1>&#39;mkdir -p .ssh &amp;&amp; cat &gt;&gt; .ssh/authorized_keys&#39;</span> &lt; ~/.ssh/id_rsa.pub
</code></pre></div><p>单引号中间的部分，表示在远程主机上执行的操作；后面的输入重定向，表示数据通过SSH传向远程主机。
这就是说，SSH可以在用户和远程主机之间，建立命令和数据的传输通道。</p><h1 id=密钥生成>密钥生成</h1><p>使用 <code>ssh-keygen</code> 生成密钥对。可以指定一段信息，密钥对存储位置，对私钥设置口令。默认情况下，在 <code>$HOME/.ssh/</code> 目录下，会新生成两个文件：<code>id_rsa.pub</code> 和 <code>id_rsa</code>。前者是你的公钥，后者是你的私钥。</p><h1 id=远程复制>远程复制</h1><p>scp 是secure copy的简写，用于在Linux下进行远程拷贝文件的命令。其使用和 cp 命令类似，只是表达远程主机上的位置时需包含远程主机信息。</p><ul><li>本地复制远程文件：（把远程的文件复制到本地）</li></ul><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>scp root@www.test.com:/val/test/test.tar.gz /val/test/test.tar.gz
</code></pre></div><ul><li>远程复制本地文件：（把本地的文件复制到远程主机上）</li></ul><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>scp /val/test.tar.gz root@www.test.com:/val/test.tar.gz
</code></pre></div><h2 id=scp-命令参数>scp 命令参数</h2><ul><li><code>-1</code> 强制scp命令使用协议ssh1</li><li><code>-2</code> 强制scp命令使用协议ssh2</li><li><code>-4</code> 强制scp命令只使用IPv4寻址</li><li><code>-6</code> 强制scp命令只使用IPv6寻址</li><li><code>-B</code> 使用批处理模式（传输过程中不询问传输口令或短语）</li><li><code>-C</code> 允许压缩。（将-C标志传递给ssh，从而打开压缩功能）</li><li><code>-p</code> 留原文件的修改时间，访问时间和访问权限。</li><li><code>-q</code> 不显示传输进度条。</li><li><code>-r</code> 递归复制整个目录。</li><li><code>-v</code> 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接，验证和配置问题。</li><li><code>-c</code> cipher 以cipher将数据传输进行加密，这个选项将直接传递给ssh。</li><li><code>-F</code> ssh_config 指定一个替代的ssh配置文件，此参数直接传递给ssh。</li><li><code>-i</code> identity_file 从指定文件中读取传输时使用的密钥文件，此参数直接传递给ssh。</li><li><code>-l</code> limit 限定用户所能使用的带宽，以Kbit/s为单位。</li><li><code>-o</code> ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式，</li><li><code>-P</code> port 注意是大写的P, port是指定数据传输用到的端口号</li><li><code>-S</code> program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。</li></ul><h1 id=参考资料>参考资料</h1><ul><li>Linux 文档</li><li><a class=link href=https://blog.csdn.net/u013452337/article/details/80847113 target=_blank rel=noopener>什么是SSH 以及常见的ssh 功能</a></li></ul></section><footer class=article-footer><section class=article-copyright><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copyright" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><circle cx="12" cy="12" r="9"/><path d="M14.5 9a3.5 4 0 100 6"/></svg><span>Licensed under CC BY-NC-SA 4.0</span></section></footer><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/katex.min.css integrity=sha384-RZU/ijkSsFbcmivfdRBQDtwuwVqK7GMOw6IMvKyeWL2K5UAlyp6WonmB8m7Jd0Hn crossorigin=anonymous><script src=https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/katex.min.js integrity=sha384-pK1WpvzWVBQiP0/GjnvRxV4mOb0oxFuyRxJlk6vVw146n3egcN5C925NCP7a7BY8 crossorigin=anonymous defer></script><script src=https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/contrib/auto-render.min.js integrity=sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl crossorigin=anonymous defer></script><script>window.addEventListener("DOMContentLoaded",()=>{renderMathInElement(document.querySelector(`.article-content`),{delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}]})})</script></article><aside class=related-contents--wrapper><h2 class=section-title>Related contents</h2><div class=related-contents><div class="flex article-list--tile"><article><a href=/posts/tools/psake/><div class=article-details><h2 class=article-title>psake</h2></div></a></article><article><a href=/posts/tools/github-workflow/><div class=article-details><h2 class=article-title>GitHub Actions - Workflow</h2></div></a></article><article><a href=/posts/tools/proglang-dockerfile/><div class=article-details><h2 class=article-title>Dockerfile</h2></div></a></article><article class=has-image><a href=/posts/tools/proglang-yaml/><div class=article-image><img src=https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/yaml/yaml.png loading=lazy data-key data-hash=https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/yaml/yaml.png></div><div class=article-details><h2 class=article-title>YAML Ain't Markup Language</h2></div></a></article><article><a href=/posts/tools/gdb/><div class=article-details><h2 class=article-title>GDB - The GNU Project Debugger</h2></div></a></article></div></div></aside><script src=https://utteranc.es/client.js repo=StardustDL/stardustdl.github.io issue-term=pathname label=comment crossorigin=anonymous async></script><style>.utterances{max-width:unset}</style><script>function setUtterancesTheme(b){let a=document.querySelector('.utterances iframe');a&&a.contentWindow.postMessage({type:'set-theme',theme:`github-${b}`},'https://utteranc.es')}addEventListener('message',a=>{if(a.origin!=='https://utteranc.es')return;setUtterancesTheme(document.documentElement.dataset.scheme)}),window.addEventListener('onColorSchemeChange',a=>{setUtterancesTheme(a.detail)})</script><footer class=site-footer><section class=copyright>&copy;
2017 -
2021 StardustDL's Blog</section><section class=powerby><a style=color:gray href=http://www.beian.miit.gov.cn>冀ICP备19021004号</a><br>Built with <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a><br>Theme <b><a href=https://github.com/CaiJimmy/hugo-theme-stack target=_blank rel=noopener data-version=3.5.0>Stack</a></b> designed by <a href=https://jimmycai.com target=_blank rel=noopener>Jimmy</a></section></footer><div class=pswp tabindex=-1 role=dialog aria-hidden=true><div class=pswp__bg></div><div class=pswp__scroll-wrap><div class=pswp__container><div class=pswp__item></div><div class=pswp__item></div><div class=pswp__item></div></div><div class="pswp__ui pswp__ui--hidden"><div class=pswp__top-bar><div class=pswp__counter></div><button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--share" title=Share></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button><div class=pswp__preloader><div class=pswp__preloader__icn><div class=pswp__preloader__cut><div class=pswp__preloader__donut></div></div></div></div></div><div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"><div class=pswp__share-tooltip></div></div><button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"></button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"></button><div class=pswp__caption><div class=pswp__caption__center></div></div></div></div></div><script src=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js integrity="sha256-ePwmChbbvXbsO02lbM3HoHbSHTHFAeChekF1xKJdleo=" crossorigin=anonymous defer></script><script src=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js integrity="sha256-UKkzOn/w1mBxRmLLGrSeyB4e1xbrp4xylgAWb3M42pU=" crossorigin=anonymous defer></script><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.css integrity="sha256-c0uckgykQ9v5k+IqViZOZKc47Jn7KQil4/MP3ySA3F8=" crossorigin=anonymous><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.css integrity="sha256-SBLU4vv6CA6lHsZ1XyTdhyjJxCjPif/TRkjnsyGAGnE=" crossorigin=anonymous></main><aside class="sidebar right-sidebar sticky"><section class="widget archives"><div class=widget-icon><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-hash" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><line x1="5" y1="9" x2="19" y2="9"/><line x1="5" y1="15" x2="19" y2="15"/><line x1="11" y1="4" x2="7" y2="20"/><line x1="17" y1="4" x2="13" y2="20"/></svg></div><h2 class="widget-title section-title">Table of contents</h2><div class=widget--toc><nav id=TableOfContents><ol><li><a href=#基本信息>基本信息</a></li><li><a href=#基础知识>基础知识</a></li><li><a href=#客户端>客户端</a><ol><li><a href=#安装>安装</a></li><li><a href=#登录>登录</a><ol><li><a href=#公钥登录>公钥登录</a></li></ol></li><li><a href=#单句执行>单句执行</a></li></ol></li><li><a href=#密钥生成>密钥生成</a></li><li><a href=#远程复制>远程复制</a><ol><li><a href=#scp-命令参数>scp 命令参数</a></li></ol></li><li><a href=#参考资料>参考资料</a></li></ol></nav></div></section></aside></div><script src=https://cdn.jsdelivr.net/npm/node-vibrant@3.1.5/dist/vibrant.min.js integrity="sha256-5NovOZc4iwiAWTYIFiIM7DxKUXKWvpVEuMEPLzcm5/g=" crossorigin=anonymous defer></script><script type=text/javascript src=/ts/main.js defer></script><script>(function(){const a=document.createElement('link');a.href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&display=swap",a.type="text/css",a.rel="stylesheet",document.head.appendChild(a)})()</script></body></html>